package com.mes.check.manager.iface;

import java.util.Date;
import java.util.List;

import com.bstek.dorado.data.provider.Page;
import com.mes.check.domain.CheckTask;
import com.mes.check.domain.CheckTaskAssign;
import com.mes.common.manager.iface.IBasicManager;
import com.mes.task.domain.OperationTask;

public interface ICheckTaskManager extends IBasicManager<CheckTask> {

	/**
	 * 将检验任务派工给检验员
	 * 
	 * @param checkTask
	 * @param checkerUid
	 * @param assnQty
	 * @throws Exception
	 */
	void dispatchCheckTask(CheckTask checkTask, String checkerUid, Float assnQty) throws Exception;

	/**
	 * 取消检验任务派工
	 * 
	 * @param checkTaskAssign
	 * @throws Exception
	 */
	void cancelDispatchCheckTask(CheckTaskAssign assn) throws Exception;
	/**
	 * 开始检验任务
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	public void startCheckTask(String checkTaskUid) throws Exception;
	/**
	 * 开始检验任务
	 * 
	 * @param checkTask
	 * @throws Exception
	 */
	public void startCheckTask(CheckTask checkTask) throws Exception;
	/**
	 * 完成检验任务
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	public void completeCheckTask(String checkTaskUid) throws Exception;
	/**
	 * 完成检验任务
	 * 
	 * @param checkTask
	 * @throws Exception
	 */
	public void completeCheckTask(CheckTask checkTask) throws Exception;
	/**
	 * 通过checkTaskAssign反馈检验任务
	 * 
	 * @param checkTaskAssignUid
	 * @throws Exception
	 */
	public void feedbackCheckTask(String checkTaskAssignUid) throws Exception;
	/**
	 * 通过checkTaskAssign反馈检验任务
	 * 
	 * @param checkTaskAssign
	 * @throws Exception
	 */
	public void feedbackCheckTask(CheckTaskAssign checkTaskAssign) throws Exception;
	
	
	
	
	
	
	
	
	/**以下方法暂时没有使用到，使用到再移上来******************/
	
	public List<CheckTask> getComingCheckTasks(String deptUid, Date beforeDate, Page<CheckTask> page) throws Exception;

	public List<CheckTask> getComingCheckTasksOfCheckDept(String deptUid, Date beforeDate, Page<CheckTask> page)
			throws Exception;
	
	/**
	 * add by zy
	 * 
	 * @param workHourDetailList
	 * @throws Exception
	 */
	public void passCheckTask(List<CheckTask> checkTaskList) throws Exception;

	/**
	 * add by zy
	 * 
	 * @param workHourDetailList
	 * @throws Exception
	 */
	public void passCheckTask(CheckTask checkTask) throws Exception;

	/**
	 * 产生首件检验任务，包括1,2,3检
	 * 
	 * @param TaskUid
	 * @throws Exception
	 */
	public void createFirstCheckTask(String taskUid) throws Exception;

	/**
	 * 产生首件一检任务
	 * 
	 * @param TaskUid
	 * @throws Exception
	 */
	public void createFirstCheckTask1(String taskUid) throws Exception;

	/**
	 * 首件一检任务是否产生
	 * 
	 * @param TaskUid
	 * @return
	 * @throws Exception
	 */
	public boolean isFirstCheckTask1Created(String taskUid) throws Exception;

	/**
	 * 产生首件二检任务
	 * 
	 * @param TaskUid
	 * @throws Exception
	 */
	public void createFirstCheckTask2(String taskUid) throws Exception;

	/**
	 * 首件二检任务是否产生
	 * 
	 * @param TaskUid
	 * @return
	 * @throws Exception
	 */
	public boolean isFirstCheckTask2Created(String taskUid) throws Exception;

	/**
	 * 产生首件三检任务
	 * 
	 * @param TaskUid
	 * @throws Exception
	 */
	public CheckTask createFirstCheckTask3(String taskUid) throws Exception;

	/**
	 * 首件三检任务是否产生
	 * 
	 * @param TaskUid
	 * @return
	 * @throws Exception
	 */
	public CheckTask createFirstCheckTask3(OperationTask operationTask) throws Exception;

	/**
	 * 首件三检任务是否产生
	 * 
	 * @param TaskUid
	 * @return
	 * @throws Exception
	 */
	public boolean isFirstCheckTask3Created(String taskUid) throws Exception;

	/**
	 * 产生工序完工检验任务
	 * 
	 * @param TaskUid
	 * @throws Exception
	 */
	public void createOperationCheckTask(String taskUid) throws Exception;

	/**
	 * 工序完工检验任务是否产生
	 * 
	 * @param TaskUid
	 * @return
	 * @throws Exception
	 */
	public boolean isOperationCheckTaskCreated(String taskUid) throws Exception;

	/**
	 * 设置首件检验任务预计送料时间
	 * 
	 * @param taskUid
	 * @param planStart
	 * @throws Exception
	 */
	void setFCT3PlanSendByTaskUid(String taskUid, Date earlyStart) throws Exception;



	/**
	 * 开始首件三检任务
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	public void startFirstCheckTask3(String checkTaskUid) throws Exception;

	/**
	 * 开始首件三检任务
	 * 
	 * @param checkTask
	 * @throws Exception
	 */
	public void startFirstCheckTask3(CheckTask checkTask) throws Exception;

	/**
	 * 完成首件检验任务
	 * 
	 * @param taskUid
	 * @param planStart
	 * @throws Exception
	 */
	void completeFirstCheckTask3(String checkTaskUid) throws Exception;

	/**
	 * 完成首件检验任务
	 * 
	 * @param taskUid
	 * @param planStart
	 * @throws Exception
	 */
	void completeFirstCheckTask3(CheckTask checkTask) throws Exception;

	/**
	 * 根据工序任务号完成首件检验任务
	 * 
	 * @param taskUid
	 * @param planStart
	 * @throws Exception
	 */
	void completeFCT3ByTaskUid(String taskUid) throws Exception;

	/**
	 * 检验任务接收物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void receiveMaterial(String checkTaskUid) throws Exception;

	/**
	 * 检验任务拒收物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void refuseMaterial(String checkTaskUid) throws Exception;

	/**
	 * 检验任务拒收物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void refuseMaterial(CheckTask checkTask) throws Exception;

	/**
	 * 检验任务发出物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void sendMaterial(String checkTaskUid) throws Exception;

	/**
	 * 检验任务接收物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void receiveMaterial(String taskUid, String checkTaskType) throws Exception;

	/**
	 * 检验员根据接收物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void receiveMaterialByTask(String taskUid) throws Exception;

	/**
	 * 检验员根据任务拒收物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void refuseMaterialByTask(String taskUid) throws Exception;

	/**
	 * 检验任务拒收物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void refuseMaterial(String taskUid, String checkTaskType) throws Exception;

	/**
	 * 检验任务接收物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void receiveMaterial(CheckTask checkTask) throws Exception;

	/**
	 * 检验任务接收物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void receiveMaterial(List<CheckTask> checkTasks) throws Exception;

	/**
	 * 检验任务发出物料
	 * 
	 * @param checkTaskUid
	 * @throws Exception
	 */
	void sendMaterial(String taskUid, String checkTaskType) throws Exception;


	/**
	 * 
	 * 判断是否在该设备上为该任务创建三检任务
	 * 
	 * @param operationTask
	 * @return
	 * @throws Exception
	 */
	public boolean isFirstCheckTask3Created(OperationTask operationTask) throws Exception;

	public CheckTask getUnRegisterCheckTask(String deviceUid) throws Exception;

	/**
	 * 为工序注册一个首件检验任务
	 * 
	 * @param operationTask
	 * @param checkDeptUid检验部门编号
	 * @param checkWorkCenterUid
	 * @param keyCount
	 * @param registerEmployeeUid
	 *            登记人编号
	 * @throws Exception
	 */
	public void registerFirstCheckTask(OperationTask operationTask, String checkDeptUid, String checkWorkCenterUid,
			Integer keyCount, String registerEmployeeUid) throws Exception;

	/**
	 * 为工序注册一个首件检验任务
	 * 
	 * @param operationTaskUid
	 *            工序任务唯一号
	 * @param checkDeptUid检验部门编号
	 * @param checkWorkCenterUid
	 * @param keyCount
	 * @param registerEmployeeUid
	 *            登记人编号
	 * @throws Exception
	 */
	public void registerFirstCheckTask(String operationTaskUid, String checkDeptUid, String checkWorkCenterUid,
			Integer keyCount, String registerEmployeeUid) throws Exception;

	/**
	 * 登记一条检验任务
	 * 
	 * @param operationTask
	 *            工序任务
	 * @param checkTaskType
	 *            检验任务类型
	 * @param checkDeptUid
	 *            检验部门编号
	 * @param checkWorkCenterUid
	 *            测试设备编号
	 * @param keyCount
	 *            特性数量
	 * @param registerEmployeeUid
	 *            登记员工
	 * @param lateFinish
	 *            期望交货时间
	 * @param sendQty
	 *            送料数量
	 * @param devicePause
	 *            停机等待
	 * @throws Exception
	 */
	public void registerCheckTask(OperationTask operationTask, String checkTaskType, String checkDeptUid,
			String checkWorkCenterUid, Integer keyCount, String registerEmployeeUid, Date lateFinish, Float sendQty,
			Boolean devicePause, String checkTaskId) throws Exception;

	/**
	 * 检验工序数量
	 * 
	 * @param checkTaskUid
	 * @param checkerUid
	 * @param checkQty
	 * @throws Exception
	 */
	public void feedbackCheckRec(String checkTaskUid, String checkerUid, float checkQty) throws Exception;

	/**
	 * 提交收件三检任务
	 * 
	 * @param operationTask
	 */
	public void submitFirstCheckTask3(String taskUid);

	/**
	 * 提交收件三检任务
	 * 
	 * @param operationTask
	 */
	public void submitFirstCheckTask3(OperationTask operationTask);

	/**
	 * 根据工序任务号删除所有检验任务
	 * 
	 * @param taskUid
	 * @param planStart
	 * @throws Exception
	 */
	void deleteCheckTasksByTaskUid(String taskUid) throws Exception;

	/**
	 * 判断某个工序的流动检验任务是否已经完成
	 * 
	 * @param taskUid
	 * @return
	 * @throws Exception
	 */
	public boolean isOperationCheckTaskFinished(String taskUid) throws Exception;

}
